#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int MAXN=510;
int map[MAXN][MAXN];
//各个节点的入度，即前驱元，即是否有元素在他前面
int indegree[MAXN];
int topo[MAXN];
int n,m,a,b;
void toposort(){
    int k=0;
    int t=0;
    priority_queue<int,vector<int>,greater<int>> que;
    for(int i=1;i<=n;i++){
        if(indegree[i]==0){
            que.push(i);
        }
    }
    while(!que.empty()){
        int tmp=que.top();
        que.pop();
        indegree[tmp]=-1;
        topo[t++]=k;
        for(int i=1;i<=n;i++){
            if(map[tmp][i]){
                indegree[i]--;
                if(indegree[i]==0){
                    que.push(i);
                }
            }
        }
    }
}
int main(void){
    scanf("%d%d",&n,&m);
    memset(indegree,0,sizeof(indegree));
    memset(map,0,sizeof(map));
    while(m--){
        scanf("%d%d",&a,&b);
        //避免重边输入 导致入度错误
        if(map[a][b]==0){
            map[a][b]=1;
            indegree[b]++;
        }
    }
    toposort();
    for(int i=0;i<n-1;i++){
        printf("%d ",topo[i]);
    }
    printf("%d\n",topo[n-1]);
    return 0;
}
